package com.springboot.spring01ioc.config;

import com.springboot.spring01ioc.bean.Person;
import com.springboot.spring01ioc.conditional.MacConditional;
import com.springboot.spring01ioc.conditional.WindowsConditional;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/*
第三方组件想要进入容器：
1.@bean：自己new一个注册给容器
2.@import：导入指定组件
*/



//组件：框架的底层配置
/*
1.@Scope（“prototype”） 非单实例  在容器创建完成后，创建非单实例组件的对象
2.@Scope（“singleton”） 单实例（默认） 在容器创造完成前，创建单实例组件的对象
    @Lazy 懒加载（只在单例模式下使用）  在容器启动完成前不会创建组件的对象
3.@Scope（“request”） 同一次请求单实例
4.@Scope（“session”） 同一次会话单实例
*/

/*配置文件：指定配置
配置类（config也是组件）：分类管理组件配置*/
@Configuration
public class PersonConfig {


    //场景：判断当前电脑的操作系统是windows还是mac
    //  windows 系统，容器中有 bill
    //  mac 系统，容器中有 joseph

    @Conditional(MacConditional.class)
    @Bean("joseph")
    public Person joseph(){
        Person person = new Person();
        person.setName("乔布斯");
        person.setAge(20);
        person.setGender("男");
        return person;
    }

    @Conditional(WindowsConditional.class)
    @Bean("bill")
    public Person bill(){
        Person person = new Person();
        person.setName("比尔盖茨");
        person.setAge(20);
        person.setGender("男");
        return person;
    }

    @Primary  //默认组件，调用Person时，默认优先调用zhangsan
    @Bean("zhangsan1")
    public Person zhang1() {

        Person person = new Person();
        person.setName("张三1");
        person.setAge(20);
        person.setGender("男");
        return person;
    }

    @Bean("zhangsan2")
    public Person zhang2() {

        Person person = new Person();
        person.setName("张三2");
        person.setAge(20);
        person.setGender("男");
        return person;
    }


    @Bean("lisi")
    public Person lisi() {

        Person person = new Person();
        person.setAge(20);
        person.setName("lisi");
        person.setGender("男");
        return person;
    }
}
